<?php

IncludeClass('BDSType', __DIR__."/classes/");
IncludeClass('BDSStructure', __DIR__."/classes/");
IncludeClass('BDSBlock', __DIR__."/classes/");
IncludeClass('BDSSection', __DIR__."/classes/");
IncludeClass('BDSElement', __DIR__."/classes/");

class BasicDataStructure {

    private static $table = false;
    private static $pid_name = false;
  
    static function GetList($filter = array(), $sort = array(), $fields = array()) {
        if(!static::$table) return false;
        $db = $GLOBALS['MAIN']->DB;
        $db->select()->table(static::$table);
        if(!empty($fields)){
            $db->field($fields);
        }else{
            $db->field();
        }
        if(!empty($filter)){
            foreach($filter as $cond){
                $db->cond($cond['field'], $cond['value'], isset($cond['cond']) ? $cond['cond'] : DB_COND_EQUAL, isset($cond['logic']) ? $cond['logic'] : DB_LOGIC_AND);
            }
        }
        
        if(!empty($sort)){
            foreach($sort as $order){
                if(isset($order[1])){
                    $db->order($order[0], $order[1]);
                }else{
                    $db->order($order[0]);
                }
            }
        }
        
        $result = $db->execute();
        return $result;
    }
    
    static function GetTree($filter = array(), $sort = array(), $fields = array()){
        $result = static::GetList($filter, $sort, $fields);
        $data = array();
        while($item = $result->Fetch()){
            $data[] = $item;
        }
        return static::__tree($data, static::$pid_name);
    }
    
    static function GetCodeTree($filter = array(), $sort = array(), $fields = array()){
        $result = static::GetList($filter, $sort, $fields);
        $data = array();
        while($item = $result->Fetch()){
            $data[] = $item;
        }
        return static::__code_tree($data, static::$pid_name);
    }
    
    static function __tree($data, $pid_name, $pid = 0){
    $result = array(); //Результирующий массив
    if (!empty($data)) { //Если входящий массив не пуст
	foreach ($data as $index => $element) { //Обходим массив. Берем элемент в обработку.
	    if ($element[$pid_name] == $pid) { //Если элемент содержит ID предка
		unset($data[$index]); //Убираем элемент из входящего массива
                $children = static::__tree($data, $pid_name, $element['id']); //Получаем потомков элемента. Рекурсия.
		if(!empty($children)){
                    $element['children'] = $children;                    
                }
		$result[] = $element;//Записываем элемент в результирующий массив
	    }
	}
    }
    return $result; //Возвращаем результат
    }
    
    static function __code_tree($data, $pid_name, $pid = 0){
         $result = array(); //Результирующий массив
    if (!empty($data)) { //Если входящий массив не пуст
	foreach ($data as $index => $element) { //Обходим массив. Берем элемент в обработку.
	    if ($element[$pid_name] == $pid) { //Если элемент содержит ID предка
		unset($data[$index]); //Убираем элемент из входящего массива
                $children = static::__code_tree($data, $pid_name, $element['id']); //Получаем потомков элемента. Рекурсия.
		if(!empty($children)){
                    $element['children'] = $children;
                }
		$result[$element['code']] = $element;//Записываем элемент в результирующий массив
	    }
	}
    }
    return $result; //Возвращаем результат
    }
    
    static function GetCount($filter){
        $result = static::GetList($filter);
        $count = 0;
        while($result->Fetch()) $count++ ;
        return $count;
    }    
    
    static function GetByID($id) {
        $result = static::GetList(array(array('field'=>'id', 'value' => $id)));
        return $result->Fetch();
    }
    
    static function Update($id, $fileds) {
        $db = $GLOBALS['MAIN']->DB;
        $db->update()->table(static::$table);
        foreach($fileds as $name=>$value){
            $db->set($name, $value);
        }
        $db->cond('id', $id);
        $result = $db->execute();
        return $result == true;
    }
    
    static function Delete($id) {
        $db = $GLOBALS['MAIN']->DB;
        $db->delete()->table(static::$table)->cond('id', $id);
        $result = $db->execute();
        return $result == true;
    }
    
    static function Create($props) {
        $db = $GLOBALS['MAIN']->DB;
        $result = $db->insert()->table(static::$table)
                ->field(array_keys($props))
                ->values($props)
                ->execute();
        return $result == true;
    }
}
